function test() {
   return '## ES Module 和 CommonJS 的区别\n' +
     '\n' +
     'ESM： import,  import(),  export,  export default\n' +
     '\n' +
     'CommonJS: require(), module.exports\n' +
     '\n' +
     '1. CommonJS 输出的是值拷贝， ES Module 输出的是值的引用\n' +
     '2. CommonJS 是运行时加载（module.exports）, ES Module 是编译时输出接口\n' +
     '3. CommonJS 的 require() 是同步加载模块， ESModule 的 import 是异步加载模块，静态编译时加载，有独立的模块依赖解析\n' +
     '4. CommonJS 模块的顶层 this 指向当前模块，ES6模块中，顶层this 指向 undefined\n' +
     '\n' +
     '\n' +
     '\n' +
     'ES Module: 静态加载/编译时加载\n' +
     '\n' +
     'CommonJS: 运行加载\n' +
     '\n' +
     'ESM效率要比 CommonJS 模块的加载方式高，动态绑定关系\n' +
     '\n' +
     '\n' +
     '\n' +
     'import: 静态执行，会提升，不可修改/只读\n' +
     '\n' +
     'export default: 指定模块的输出，输出一个叫做default 的方法/变量，系统允许修改名称\n' +
     '\n' +
     'Import(): 动态 加载模块，当需要按需加载时使用\n' +
     '\n' +
     '\n' +
     '\n' +
     '1.DNS对域名进行解析；（浏览器对输入的地址补全，然后DNS域名解析）\n' +
     '2.建立TCP连接（三次握手（客户端/服务端是否具备数据的收发能力）：客户端向服务端发送一个SYN，服务端收到了请求并且返回一个ACK+SYN问客户端是否可以接收数据，客户端确认可以接受数据，向服务端发送一个ACK），然后能够正常通信。）\n' +
     '\n' +
     '3.发送http请求（浏览器会将请求包装成请求报文，如GET/HTTP/1.0（请求的方法，请求的URL请求所使用的协议）头部信息：user-Agent Host等成对出现的值； 主体：请求头部和主体之间有一个回车换行。如果是get请求则没有主体部分，post请求有主体部分）\n' +
     '4.服务器处理请求（服务器收到请求后，就会返回数据，比如一个html页面）\n' +
     '5.返回响应结果（如果浏览器返回的是content-type是accept中的任何一个，浏览器都能解析，并直接展示在网页上。浏览器能直接处理很多种格式，并直接呈现在网页中，并不限于accept中规定的字段）\n' +
     '6.关闭TCP连接（四次挥手 客户端给服务端发送报文（FIN）请求断开连接，服务器确认客户端可以断开连接会发送一次请求（ACK），过一段时间服务器要断开连接会给客户端发送请求报文，客户端确认可以断开服务发送了一次报文）\n' +
     '7.浏览器解析HTML（浏览器通过解析html,生成DOM树，解析CSS，生成CSS规则树，然后通过DOM树和CSS规则树生成渲染树。渲染树和DOM树不同，渲染树并没有head，display为none等不必显示的节点）\n' +
     '8.浏览器布局渲染（html解析-》外部样式，脚本加载 -》外部样式执行 -》 外部样式脚本执行 -》 html继续解析 -》dom树构建完成 -》 加载图片 -》 页面加载完成）\n' +
     '\n' +
     '\n' +
     '***为什么是三次不是两次四次***\n' +
     '\n' +
     '- 第一次握手后，服务端可以确认自己收报文和客户端发报文的功能都正常，而客户端什么都不能确认\n' +
     '- 第二次握手客户端可以确认自己收发报文与服务端收发报文的功能正常，也就是认为连接已建立。\n' +
     '- 那么第三次呢，服务端也可以确认双方能够正常通信。\n' +
     '\n' +
     '假想一下，如果我们去掉了第三次呢？\n' +
     '\n' +
     '如果只是第二次建立的话，服务端和客户端就已经建立，但是如果客户端没有收到服务端的回应？这个时候客户端认为没有建立，服务端却认为建立成功，并保存了必要的资源，如果出现大量的这样的情况。那么服务器会崩溃。\n' +
     '因此第三次握手是必要的。\n' +
     '\n' +
     '为什么不是四次\n' +
     '因为三次握手之后，客户端和服务端至少可以确认之前的通信情况，但无法确认之后的情况。所以如果四次还是五次或是更多次都是徒劳的。\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '# nodejs\n' +
     '\n' +
     '  [Node.js — Introduction to Node.js (nodejs.org)](https://nodejs.org/en/learn/getting-started/introduction-to-nodejs)\n' +
     '\n' +
     '\n' +
     '\n' +
     '  Nodejs 是一个开源的跨平台的 Javascript 运行时环境。它几乎是任何类型项目的流行工具！\n' +
     '\n' +
     'Node.js 在浏览器之外运行 V8 JavaScript 引擎，这事 Google Chrome 的核心。这使得 Node.js 的性能非常高。\n' +
     '\n' +
     'Node.js 应用在单进程中进行，无需为每个请求创建新线程。Node.js 在其标准库中提供了一组异步 I/O 原语（例如从网络读取，访问数据库或文件系统），可防止 JavaScript 代码阻塞，通常，Node.js 中的库时使用非阻塞范式编写的，这使得阻塞行为称为例外而不是常态。\n' +
     '\n' +
     '\n' +
     '\n' +
     '## Node.js 的主要优点包括以下几个方面：\n' +
     '\n' +
     '1. 异步编程模型： Node.js 采用了事件驱动，非阻塞I/O 模型，使其能够在大量连接的情况下保持高性能和稳定性。\n' +
     '\n' +
     '2. 单一编程语言：Node.js 使用的是 JavaScript ，这是一种被广大开发者所熟悉的语言，能够大大降低学习成本。\n' +
     '\n' +
     '3. 开源社区活跃： Node.js 有一个非常活跃的开源社区，有大量的模块可供使用，极大地提高了开发效率。\n' +
     '\n' +
     '4. 跨平台性：Node.js可以在多种操作系统上运行，如windows,Linux,macOS 等。\n' +
     '\n' +
     '5. 高性能： 由于Node.js 的非阻塞I/O模型，使其在处理大量并发请求时具有极高的性能。\n' +
     '\n' +
     '6. 数据密集型应用： Node.js 擅长处理数据密集型应用，如实时通信，实时流媒体，实时游戏等。\n' +
     '\n' +
     '   \n' +
     '\n' +
     '   综上，Node.js 凭借其独特的异步编程模型和强大的社区支持，称为了一种优秀的服务端技术选择\n' +
     '\n' +
     '\n' +
     '\n' +
     '## Node.js. 采用那种编程模式，优势是什么？\n' +
     '\n' +
     'Node.js 采用的是事件驱动编程模式，这种模式使得 Node.js 能够在不需要等待 I/O（例如从网络读取，访问数据库或文件系统） 操作完成的情况下继续执行其他的任务。这样做的好处是可以提高系统的吞吐量，尤其是在处理高并发的网络请求时，能够大大的提高响应速度。\n' +
     '\n' +
     '此外，Node.js 还支持回调函数，Promise 和 async/await 等不同的异步操作编程方式，可以根据具体的应用场景灵活选择合适的编程方式。这样做的好处是可以提高代码的可读性和可维护性，同时也能够更好的控制代码的执行流程。\n' +
     '\n' +
     '总的来说，Node.js 的事件驱动模式和灵活的异步编程方式为其带来了高效，稳定和易用的优势。\n' +
     '\n' +
     '\n' +
     '\n' +
     '## 解释一下 Event Loop 的工作原理\n' +
     '\n' +
     'Event Loop 是 Node.js 实现异步编程的关键部分，他负责管理所有的事件和回调函数。\n' +
     '\n' +
     '当一个事件触发时，Event loop 会将相关的回调函数放入队列中等待执行。这些回调函数按照一定的优先级进行排列，一旦执行环境空闲，Event Loop 就会开始执行队列中的下一个回调函数。\n' +
     '\n' +
     '当一个回调函数执行完毕后，Event loop 会重新检查队列，看是否有新的事件需要处理。如果有，他会将相关的回调函数放入队列中；如果没有，他则会进入等待状态，直到有新的事件发生。\n' +
     '\n' +
     '这就是 Event Loop 的基本工作原理，通过不断地检查和执行回调函数，实现了Node.js 的异步编程能力。\n' +
     '\n' +
     '\n' +
     '\n' +
     '## 你是如何使用 npm 来管理 Node.js 项目的依赖关系的？\n' +
     '\n' +
     '我们通常使用 npm 来进行 Node.js 项目的依赖关系管理。\n' +
     '\n' +
     '首先，在项目根目录下创建一个名为 `package.json` 的文件，其中包含项目的元信息和依赖列表。然后，我会在文件中列出项目所需要的每个依赖及其版本号。比如，如果我的项目需要Express 框架，那么我可以在 `dependencies` 对象中添加一行代码如下：\n' +
     '\n' +
     '```json\n' +
     '"dependencies": {\n' +
     '\t"express": "^4.17.1"\n' +
     '}\n' +
     '```\n' +
     '\n' +
     '接着，我们可以使用 `npm install `  命令来安装这些依赖项。这个命令会在本地的 `node_modules` 目录下下载并安装指定的依赖包。如果在后续的开发过程中，我又需要用到其他的新依赖包，则可以修改 `package.json` 文件并在此运行 `npm install` 命令。\n' +
     '\n' +
     '除此之外，我还常用`npm update` 命令来更新已有的依赖包到最新版本。在开发完成后，还可以使用 `npm publish` 命令将项目发布到 npm registry 供他人使用。\n' +
     '\n' +
     '总之，npm 提供了强大的功能来管理和分发 Node.js 项目的依赖关系，使得整个开发过程变得更加简单和高效。\n' +
     '\n' +
     '\n' +
     '\n' +
     '## Node.js  的同步和异步编程是什么意思？\n' +
     '\n' +
     'Node.js 的同步和异步编程是一种描述程序执行方式不同的术语。\n' +
     '\n' +
     '同步编程指的是程序按照顺序一次执行的方式。在这中方式下，程序会逐行地执行代码，并且在某条代码执行完毕之前，其他后续代码都会暂停等待。这种方式适用于那些顺序依赖性强，逻辑复杂度低的情况。\n' +
     '\n' +
     '而异步编程则是指程序在同一时间内可以并行执行多个任务的方式。在这种方式下，程序可以不按顺序的执行代码，并且可以在某些任务未完成时就开始执行其他任务。这种方式适用于那些顺序依赖性较弱，并发性要求较高的情况。\n' +
     '\n' +
     'Node.js 主要支持异步编程，并且通过 Event Loop 机制实现了高效的并发能力。然而，为了兼容其他编程风格，也支持一些同步编程的功能。\n' +
     '\n' +
     '\n' +
     '\n' +
     '## setTimeout , Promise,  Async/Await 的区别\n' +
     '\n' +
     '1. setTimeout\n' +
     '\n' +
     'setTimeout 的回调函数会放到宏任务队列里，等执行栈情况以后执行\n' +
     '\n' +
     '2. Promise\n' +
     '\n' +
     'Promise 本身是同步的立即执行函数，当在 executor 中执行resolve 或 reject的时候，此时是异步操作，会先执行then/catch 等，当主栈完成后，才回去调用resolve/reject 中存放的方法执行。\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240126133743366](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126133743366.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     'Js 的运行环境用来解析js 代码\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240126134514376](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126134514376.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240126134936889](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126134936889.png)\n' +
     '\n' +
     '![image-20240126135023959](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126135023959.png)\n' +
     '\n' +
     'blink 浏览器的内核（排版解析）\n' +
     '\n' +
     '\n' +
     '\n' +
     '// 浏览器不能读取文件系统，不允许跨域\n' +
     '\n' +
     '// 服务端不再是限制\n' +
     '\n' +
     '![image-20240126135213327](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126135213327.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240126135232771](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126135232771.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240126135401690](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126135401690.png)\n' +
     '\n' +
     '![image-20240126141409867](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126141409867.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240126141454686](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126141454686.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240126141623890](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126141623890.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240126145546884](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126145546884.png)\n' +
     '\n' +
     '![image-20240126163407403](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126163407403.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240126164142794](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126164142794.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240126164340028](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126164340028.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240126170535020](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126170535020.png)!(/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240126170656636.png)\n' +
     '\n' +
     '![image-20240129092546676](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240129092546676.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     'https://www.bilibili.com/video/BV1rA4y1Z7fd/?p=11&spm_id_from=pageDriver\n' +
     '\n' +
     '\n' +
     '\n' +
     '  [将本地项目上传至gitee的方法截图+详细步骤_上传gitee的用户名和密码是什么时候建的-CSDN博客](https://blog.csdn.net/qq_38215042/article/details/109406958)\n' +
     '\n' +
     '![image-20240129094406319](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240129094406319.png)\n' +
     '\n' +
     '**npm i nodemon **// 自动重启服务器 然后启动也要用 nodemon ./01-sever.js \n' +
     '\n' +
     '**npm i -g node-dev** //  node-dev ./01-sever.js \n' +
     '\n' +
     '![image-20240129100856293](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240129100856293.png)\n' +
     '\n' +
     '![image-20240129102608987](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240129102608987.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '[首页 | Node.js v20 文档 (nodejs.cn)](https://nodejs.cn/api/)\n' +
     '\n' +
     '[url 网址 | Node.js v20 文档 (nodejs.cn)](https://nodejs.cn/api/url.html)\n' +
     '\n' +
     '![image-20240129112523823](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240129112523823.png)\n' +
     '\n' +
     '![image-20240129113324674](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240129113324674.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240219160359921](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240219160359921.png)\n' +
     '\n' +
     '![image-20240219164206275](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240219164206275.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240219164624737](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240219164624737.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240219165131677](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240219165131677.png)\n' +
     '\n' +
     '![image-20240219173209024](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240219173209024.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '!(/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240219175131665.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240219175442848](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240219175442848.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240220112705102](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240220112705102.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240227094128562](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240227094128562.png)\n' +
     '\n' +
     '<img src="/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240227110612064.png" alt="image-20240227110612064" style="zoom:80%;" />\n' +
     '\n' +
     '  ![image-20240227110843893](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240227110843893.png)\n' +
     '\n' +
     '![image-20240227113540844](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240227113540844.png)\n' +
     '\n' +
     '![image-20240227113657197](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240227113657197.png)\n' +
     '\n' +
     '![image-20240227113843878](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240227113843878.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240227132225527](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240227132225527.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240227132339789](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240227132339789.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240227132405401](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240227132405401.png)\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '\n' +
     '![image-20240219134917834](/Users/danyang.zhang/Library/Application Support/typora-user-images/image-20240219\n' +
     '\n' +
     '134917834.png) '
}